package fr.utbm.tx52.contactsManagement;

import java.io.InputStream;

import fr.utbm.tx52.R;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;

/**
 * Représente un contact manipulé par l'application
 */
public class Contact implements Comparable<Contact> {
	
	/**
	 * Identifiant android du contact
	 */
	String id;
	
	/**
	 * Nom du contact
	 */
    String name;
    
    /**
     * Numéro de téléphone du contact
     */
    String phoneNumber;
    
    /**
     * Image du contact
     */
    Bitmap bitmap;

    /**
     * Construit le contact
     * 
     * @param name
     * 			Nom du contact
     * @param img
     * 			Image du contact
     * @param id
     * 			Identifiant du contact
     * @param phoneNumber
     * 			Numéro de téléphone du contact
     */
    public Contact(String name, Bitmap img, String id, String phoneNumber) {
    	this.name = name;
    	this.bitmap = img;
        this.id = id;
        this.phoneNumber = phoneNumber;
    }
    
    /**
     * Obtient l'identifiant du contact
     * 
     * @return L'ID du contact
     */
    public String getID() {
    	return id;
    }

    /**
     * Obtient le nom du contact
     * 
     * @return Le nom du contact
     */
    public String getName() {
        return name;
    }

    /**
     * Obtient l'image du contact
     * 
     * @return L'image du contact
     */
    public Bitmap getBitmap() {
        return bitmap;
    }
    
    /**
     * Obtient le numéro de téléphone du contact
     * 
     * @return Le numéro de téléphone du contact
     */
    public String getPhoneNumber() {
    	return phoneNumber;
    }

    /**
     * Compare deux contacts, sur leur nom dans le cas présent
     * 
     * @return @see Comparable
     */
	public int compareTo(Contact another) {
		return name.compareTo(another.name);
	}
    
	
	
	/**
	 * Obient le nom d'un contact à partir de son identifiant
	 * 
	 * @param id
	 * 			L'identifiant du contact
	 * @return Le nom du contact
	 */
    public static String getContactNameFromID(final Activity activity, final Integer id) {
    	
    	Uri dataUri = ContactsContract.Data.CONTENT_URI;
    	
    	String[] projection = new String[] { 
    			ContactsContract.Contacts.DISPLAY_NAME,           
	            ContactsContract.CommonDataKinds.Phone.CONTACT_ID
	            };

    	Cursor c = activity.managedQuery(
    		       dataUri,
    		       projection,
    		       ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id.toString(),
    		       null, null);
    	
    	c.moveToFirst();
    	return c.getString(0);
    }
	
    
	/**
	 * Obtient l'image d'un contact à partir de son ID
	 * 
	 * @param context
	 * 					Le contexte de l'application
	 * @param contactId
	 * 					L'identifiant du contact
	 * @return L'image du contact
	 */
    public static Bitmap loadContactPhoto(Context context, Long contactId) {
        Uri contactPhotoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
        ContentResolver cr=(ContentResolver) context.getContentResolver();
        InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, contactPhotoUri);
        Bitmap b = BitmapFactory.decodeStream(input);
        if( b == null ) {
                return ((BitmapDrawable)context.getResources().getDrawable(R.drawable.icon)).getBitmap(); // icone des contacts par défaut
        } else {
                return b;
        }
    }
    
    
    /**
	 * Renvoi une instance de contact à partir de l'ID donné
	 *
	 * @param id
	 * 			L'identifiant du contact
	 * @return
	 */
	public static Contact getContactFromID(Context context, String id)
	{
		String phoneNumber = new String("");

		// récupération du numéro de téléphone
		String[] projectionPhone = new String[] {
			ContactsContract.CommonDataKinds.Phone.NUMBER
		};
		
		Cursor phones = context.getContentResolver().query(
				ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
				projectionPhone,
				ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id,
				null,
				null
				);

		phones.moveToNext();
		phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
		phones.close();

		// autres données du contact
		String[] projection = new String[] {
			ContactsContract.Contacts.DISPLAY_NAME,
			ContactsContract.CommonDataKinds.Phone.CONTACT_ID
		};

		Cursor c = context.getContentResolver().query(
				ContactsContract.Data.CONTENT_URI,
				projection,
				ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id,
				null, null);

		c.moveToFirst();

		String name = c.getString(0);

		Bitmap photo = Contact.loadContactPhoto(context, Long.decode(id.toString()));

		return new Contact(
				name,
				photo,
				id.toString(),
				phoneNumber
				);

	}
	
	
	/**
	 * Envoi une instance de contact à partir du numéro de téléphone donné
	 * 
	 * @param c
	 * 			L'activité qui veut le contact
	 * 
	 * @param phone
	 * 			Le numéro de téléphone du contact
	 * 
	 * @return Le contact dont le numéro est donné
	 */
	public static Contact getContactsByPhone(Context context, String phone) {  
		
		String[] projection = new String[] {
			ContactsContract.CommonDataKinds.Phone.CONTACT_ID
		};
		
    	Cursor phones = context.getContentResolver().query(
				ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
				projection,
				ContactsContract.CommonDataKinds.Phone.NUMBER+ "= '" + phone +"'",
				null,
				null
				);
    	
    	phones.moveToFirst();
    	
    	return getContactFromID(context, phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)));
	}
    
}



